package ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.tabla;

import java.beans.PropertyDescriptor;

import javax.swing.table.AbstractTableModel;

import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.AdapterException;

public abstract class TableModelBeanAdapter extends AbstractTableModel {

    /**
     * Descriptores de las properties utilizadas para completar los datos de la
     * tabla.
     */
    private PropertyDescriptor[] properties;
 
    /**
     * pre : <code>propertyNames</code> corresponden con los nombre de
     * properties existentes en <code>beanClass</code>.
     * 
     * @param beanClass
     * @param propertyNames
     */
    public TableModelBeanAdapter(Class<?> beanClass, String... propertyNames) {

        try {

            this.properties = new PropertyDescriptor[propertyNames.length];

            for (int indice = 0; indice < propertyNames.length; indice++) {

                this.properties[indice] = new PropertyDescriptor(
                        propertyNames[indice], beanClass);
            }

        } catch (Exception error) {

            throw new AdapterException(
                    "No se pudo crear el TableModelBeanAdapter", error);
        }
    }

    public int getColumnCount() {

        return this.getProperties().length;
    }

    protected PropertyDescriptor[] getProperties() {

        return this.properties;
    }

    /**
     * pre : <code>bean</code> es una instancia de la <code>beanClass</code>
     * configurada en el constructor. post: devuelve el valor de la property en
     * la posicion <code>column</code> del <code>bean</code>.
     * 
     * @param bean
     * @param column
     * @return
     */
    protected Object getValueAt(Object bean, int column) {

        try {

            return this.getProperties()[column].getReadMethod().invoke(bean);

        } catch (Exception error) {

            throw new AdapterException(
                    "No se pudo leer el valor para la columna " + column, error);
        }
    }
    
    public String getColumnName(int column) {
    
        return this.getProperties()[column].getDisplayName();
    }
}
